package com.tinfeng.oop;

public class JavaInterFace {
    // 接口
    // 接口定义了行为协议，其中定义了一组抽象方法，没有具体实现，实现该接口的类必须实现接口中定义的所有抽象方法

    // 接口是为了解决单继承这个弊端而产生的，虽然一个类只能有一个直接父类，但可以实现多个接口
    // 接口除了方法声明外，还可以包含常量声明。在接口中定义的所有的常量默认都是 public，static，和 final 的。
    //
    //接口中的成员声明不允许使用 private 和 protected 修饰符。

    // 实现接口要用implements 加接口类名称 实现多个的话就","隔开

    /**
     * 还可继承多个接口 extends 加","
     * 补充一点，当一个实现类存在 extends 关键字，那么 implements 关键字应该放在其后：
     *
     * public class MyClass extends SuperClass implements MyInterface {
     *    ...
     * }
     */
    // 可在接口中定义默认方法(default)，且 实现类中可以不实现默认方法，实现类中写默认方法时不需要用(default),public也行
    /**
     * public class Student implements Person {
     *        @Override
     *     public void run() {
     *         System.out.println("学生可以跑步");
     *     }
     *
     *   	// 重写默认方法
     *    @Override
     *    public void eat() {
     *       	// 使用 接口名.super.方法名() 的方式调用接口中默认方法
     *       	Person.super.eat();
     *          这就是直接饮用接口中的方法
     *       	System.out.println("学生吃东西");
     *     }
     * }
     */
    //如果想要在实现类中调用接口的默认方法，可以使用接口名.super. 方法名 () 的方式调用。这里的 接口名.super 就是接口的引用。

    /**
     * 静态方法
     * 声明
     * 使用 static 关键字在接口中声明静态方法，例如：
     *
     * public interface Person {
     *     void walk();
     *     // 声明静态方法
     *     static void sayHello() {
     *         System.out.println("Hello imooc!");
     *     }
     * }
     * 调用
     * 类中的静态方法只能被子类继承而不能被重写，同样在实现类中，静态方法不能被重写。如果想要调用接口中的静态方法，只需使用 接口名。类方法名 的方式即可调用：
     *
     * public class Student implements Person {
     *     @Override
     *     public void walk() {
     *       	// 调用接口中的类方法
     *         Person.sayHello();
     *         System.out.println("学生会走路");
     *     }
     * }
     */

    /**
     * 接口和抽象类的区别：
     * 接口的方法默认是 public ，所有方法在接口中不能有实现（Java 8 开始接口方法可以有默认实现），而抽象类可以有非抽象的方法；
     * 接口中除了 static 、final 变量，不能有其他变量，而抽象类可以；
     * 一个类可以实现多个接口，但只能实现一个抽象类。接口自己本身可以通过 extends 关键字扩展多个接口；
     * 接口方法默认修饰符是 public ，抽象方法可以有 public 、protected 和 default 这些修饰符（抽象方法就是为了被重写所以不能使用 private 关键字修饰！）；
     * 从设计层面来说，抽象是对类的抽象，是一种模板设计，而接口是对行为的抽象，是一种行为的规范。
     */
    // 多个接口中存在同名的默认方法，在实现类中重写即可
    // 多个接口汇总存在同名的变量，继承后，打印时需要声明
}
